/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package com.controller.servlet;

import com.context.AppContext;
import com.context.ControllerContext;
import com.controller.AbstractController;
import com.controller.AbstractDataXmlController;
import com.controller.DataXmlCampoController;
//import com.controller.ConglomeradoPersonalController;
import com.controller.ConglomeradoPersonalResumenController;
import com.controller.MonitoreoTransferenciaController;
import com.controller.PersonalController;
import com.controller.ProgramacionPeriodoController;
import com.controller.ReporteTransferenciaController;
import com.controller.UsuarioController;
import util.controller.Accion;
import util.controller.Vista;
import com.controller.exception.UsuarioException;
import com.model.service.ReporteTransferenciaService;
import java.io.IOException;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import util.ThreadUtil;
import util.log.MiLogger;

/**
 *
 * @author Rdelacruz
 */
public class DispatcherHtmlServlet extends HttpServlet {
    
    
    //Se crea una única instancia del Servlet si no existe
    //Todas las peticiones trabajan con la misma instancia del Servlet
    //Cada vez que se realiza deploy() se destruye el servlet    
    //NOTA: El tiempo de vida de DispatcherHtmlServlet es el mismo que los Controllers
    public DispatcherHtmlServlet() throws Exception {
        //System.out.println("CREANDO DispatcherHtmlServlet");
    }
    
    private void testThreadInicio() throws Exception {
        System.out.println("INICIO: HILO "+ThreadUtil.getIdentificadorHiloActual());
        ControllerContext cc = AppContext.getInstancia().getControllerContext();
        ReporteTransferenciaService serv = (ReporteTransferenciaService) cc.getReporteTransferenciaController().getService();
        serv.getViviendaService().findByKey("");
    }
    
    private void testThreadFin() throws Exception {
        System.out.println("FIN: HILO "+ThreadUtil.getIdentificadorHiloActual());
        ControllerContext cc = AppContext.getInstancia().getControllerContext();
        ReporteTransferenciaService serv = (ReporteTransferenciaService) cc.getReporteTransferenciaController().getService();
        serv.getViviendaService().findByKey("");
    }  

    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
     * methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        MiLogger logger = MiLogger.getLogger(response,AppContext.getInstancia().getLoggerContext().getLoggerErrores());
        
        Vista v = new Vista();
         
        try {                            
            
            //testThreadInicio();             
            //System.out.println("LLAMANDO A processRequest()");                   
            response.setContentType("text/html;charset=UTF-8");            
            
            //1. Primero valida el request
            UsuarioController usuarioController = AppContext.getInstancia().getControllerContext().getUsuarioController();
            
            Accion accion = usuarioController.validarRequest(request,response);            
              
            //2. Luego despacha el request       
            String action = accion.getMetodo();
            AbstractController controller = accion.getControlador();          

            //Llamando a la acción del controlador respectivo
            if( controller instanceof AbstractDataXmlController ) {
                AbstractDataXmlController c = (AbstractDataXmlController) controller;                    
                if(action.equals("upload")) {                        
                    c.upload(request,response);
                }
                else if(action.equals("menuSubirXml")) {
                    c.menuSubirXml(request,response);
                }
                else if(action.equals("upload_cargar")) {
                    c.upload_cargar(request, response);
                }

                if(c instanceof DataXmlCampoController) {
                    DataXmlCampoController ccampo = (DataXmlCampoController) c;
                    if(action.equals("menuSubirCargarXml")) {
                        ccampo.menuSubirCargarXml(request, response);
                    } 
                    else if(action.equals("cargaManualDeRecuperacionEnvios")){
                        ccampo.cargaManualDeRecuperacionEnvios(request, response);
                    }
                    else if(action.equals("forzarCargaAutomatica")) {
                        ccampo.forzarCargaAutomatica(request, response);
                    }
                    else if(action.equals("menuInformacionCarga")) {
                        ccampo.menuInformacionCarga(request, response);
                    }
                }
            }
            else if( controller instanceof UsuarioController ) {
                UsuarioController c = (UsuarioController) controller;
                if(action.equals("home")) {                            
                    c.home(request, response);
                }
                else if(action.equals("welcome")) {
                    c.welcome(request, response);
                }
                else if(action.equals("homeModuloTransferencia")) {
                    c.homeModuloTransferencia(request, response);
                }
            }
            else if( controller instanceof ReporteTransferenciaController ) {
                ReporteTransferenciaController c = (ReporteTransferenciaController) controller;

                if(action.equals("verRecojoDatosResumen")) {                            
                    c.verRecojoDatosResumen(request, response);
                }
                else if(action.equals("buscarRecojoDatosResumen")) {
                    c.buscarRecojoDatosResumen(request, response);
                }
                else if(action.equals("verRecojoDatosDetalle")) {
                    c.verRecojoDatosDetalle(request, response);
                }
                else if(action.equals("buscarRecojoDatosDetalle")) {
                    c.buscarRecojoDatosDetalle(request, response);
                }
                else if(action.equals("verGeoreferenciacionViviendas")) {
                    c.verGeoreferenciacionViviendas(request, response);
                }
                else if(action.equals("buscarGeoreferenciacionViviendas")) {
                    c.buscarGeoreferenciacionViviendas(request, response);
                }
                else if(action.equals("verEnviosViviendas")) {
                    //c.verEnviosViviendas(request, response);
                }
                else if(action.equals("buscarEnviosViviendas")) {
                    //c.buscarEnviosViviendas(request, response);
                }
            }
            else if( controller instanceof MonitoreoTransferenciaController ) {
                MonitoreoTransferenciaController c = (MonitoreoTransferenciaController) controller;
                if(action.equals("verPorViviendas")) {
                    c.verPorViviendas(request, response);
                }
                else if(action.equals("buscarPorViviendas")) {
                    c.buscarPorViviendas(request, response);
                }
                else if(action.equals("verPorCapitulosResumen")) {
                    c.verPorCapitulosResumen(request, response);
                }
                else if(action.equals("buscarPorCapitulosResumen")) {
                    c.buscarPorCapitulosResumen(request, response);
                }
                else if(action.equals("verPorCapitulosDetalle")) {
                    c.verPorCapitulosDetalle(request, response);
                }
                else if(action.equals("buscarPorCapitulosDetalle")) {
                    c.buscarPorCapitulosDetalle(request, response);
                }
                else if(action.equals("verComboCapitulos")) {
                    c.verComboCapitulos(request, response);
                }
                else if(action.equals("verRecuperacionEnvios")) {
                    c.verRecuperacionEnvios(request, response);
                }
                else if(action.equals("buscarRecuperacionEnvios")) {
                    c.buscarRecuperacionEnvios(request, response);
                }
                else if(action.equals("verReglasControlEnvios")) {
                    c.verReglasControlEnvios(request, response);
                }
            }
            //else if( controller instanceof LogXmlCargadoController ) {
            //    LogXmlCargadoController c = (LogXmlCargadoController) controller;
            //    c.cargaManualDeRecuperacionEnvios(request, response);
            //}
            else if( controller instanceof PersonalController ) {
                PersonalController c = (PersonalController) controller;
                if(action.equals("verMantenimiento")) {
                    c.verMantenimiento(v,request, response);
                }
                else if(action.equals("buscar")) {
                    c.buscar(v,request, response);
                }
                else if(action.equals("nuevo")) {
                    c.nuevo(v,request, response);
                }
                else if(action.equals("guardar")) {
                    c.guardar(v,request, response);
                }
                else if(action.equals("actualizar")) {
                    c.actualizar(v,request, response);
                }
                else if(action.equals("modificar")) {
                    c.modificar(v,request, response);
                }
                else if(action.equals("eliminar")) {
                    c.eliminar(v,request, response);
                }
                else if(action.equals("cancelar")) {
                    c.cancelar(v,request, response);
                }
                else if(action.equals("verDescargaArchivos")) {
                    c.verDescargaArchivos(v,request, response);
                }
                else if(action.equals("descargarArchivoXml")) {
                    c.descargarArchivoXml(v,request, response);
                }
                else if(action.equals("verComboOdei")) {
                    c.verComboOdei(v,request, response);
                }
                else if(action.equals("descargarArchivoExcel")) {
                    c.descargarArchivoExcel(v,request, response);
                }
                
            }
            else if( controller instanceof ConglomeradoPersonalResumenController ) {
                ConglomeradoPersonalResumenController c = (ConglomeradoPersonalResumenController) controller;
                if(action.equals("verProgramacion")) {
                    c.verProgramacion(v,request, response);
                }
                else if(action.equals("buscarProgramacion")) {
                    c.buscarProgramacion(v,request, response);
                }
                else if(action.equals("verReporte")) {
                    c.verReporte(v,request, response);
                }
                else if(action.equals("buscarReporte")) {
                    c.buscarReporte(v,request, response);
                }
                else if(action.equals("nuevo")) {
                    c.nuevo(v,request, response);
                }
                else if(action.equals("editar")) {
                    c.editar(v,request, response);
                }
                else if(action.equals("guardar")) {
                    c.guardar(v,request, response);
                }
                else if(action.equals("eliminar")) {
                    c.eliminar(v,request, response);
                }
            }
            /*
            else if( controller instanceof ConglomeradoPersonalController ) {
                ConglomeradoPersonalController c = (ConglomeradoPersonalController) controller;
                if(action.equals("verProgramacion")) {
                    c.verProgramacion(v,request, response);
                }
                else if(action.equals("buscarProgramacion")) {
                    c.buscarProgramacion(v,request, response);
                }
                else if(action.equals("nuevo")) {
                    c.nuevo(v,request, response);
                }
                else if(action.equals("editar")) {
                    c.editar(v,request, response);
                }                
                else if(action.equals("guardar")) {
                    c.guardar(v,request, response);
                }
                else if(action.equals("json")) {
                    c.json(request, response);
                }
                else if(action.equals("eliminar")) {
                    c.eliminar(v,request, response);
                }
                else if(action.equals("verResumen")) {
                    c.verResumen(v,request, response);
                }
                else if(action.equals("buscarResumen")) {
                    c.buscarResumen(v,request, response);
                }
            }
            */
            else if( controller instanceof ProgramacionPeriodoController ) {
                ProgramacionPeriodoController c = (ProgramacionPeriodoController) controller;
                if(action.equals("verMantenimiento")) {
                    c.verMantenimiento(v,request, response);
                }
                else if(action.equals("json")) {
                    c.json(request, response);
                }
                else if(action.equals("guardar")) {
                    c.guardar(v,request, response);
                }
            }
            //else {
            //    logger.loge("Falta implementar la llamada a la acción '"+action+"' del controlador '"+idController+"'");
            //}       
            
            //Guardando un log del request
            usuarioController.logRequest(this,request,accion.getIdControlador(),action);
        } 
        catch (UsuarioException ex) {
            String mensaje = ex.getMessage();
            if(mensaje!=null) {
                //log ger.logm(mensaje);                
                mensaje = URLEncoder.encode(mensaje, "UTF-8");
                response.sendRedirect("pagweb/ver_caducado.jsp?mensaje="+mensaje);
            }
        }
        catch (Exception ex) {     
            //Logger.getLogger(UploadServlet.class.getName()).log(Level.SEVERE, null, ex);                        
            logger.loge("No se pudo terminar el procesamiento",ex);
        }
        finally {
            //testThreadFin();
        }        
        
        String url = v.getUrl();
        if(url!=null)
            request.getRequestDispatcher(url).forward(request, response);
        
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

}
